package com.ryskoo.catering.vendortemplaterel.service;

import com.ryskoo.catering.producttemplateattr.domain.ProductTemplateAttrPO;
import com.ryskoo.catering.producttemplateattr.repository.IProductTemplateAttrRepository;
import com.ryskoo.catering.producttemplateattrvalue.domain.ProductTemplateAttrValuePO;
import com.ryskoo.catering.producttemplateattrvalue.repository.IProductTemplateAttrValueRepository;
import com.ryskoo.catering.vendortemplaterel.domain.VendorTemplateRelInteractivePO;
import com.ryskoo.catering.vendortemplaterel.domain.VendorTemplateRelPO;
import com.ryskoo.catering.vendortemplaterel.repository.IVendorTemplateRelRepository;
import com.ryskoo.catering.vendortemplatereldetail.domain.VendorTemplateRelDetailPO;
import com.ryskoo.catering.vendortemplatereldetail.repository.IVendorTemplateRelDetailRepository;
import com.ryskoo.framework.core.service.BasicServiceImpl;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

@Service
@Transactional
public class VendorTemplateRelServiceImpl extends BasicServiceImpl<VendorTemplateRelPO> implements IVendorTemplateRelService {
    @Autowired
    private IVendorTemplateRelRepository vendorTemplateRelRepository;
    @Autowired
    private IVendorTemplateRelDetailRepository vendorTemplateRelDetailRepository;
    @Autowired
    private IProductTemplateAttrValueRepository productTemplateAttrValueRepository;
    @Autowired
    private IProductTemplateAttrRepository productTemplateAttrRepository;

    @PostConstruct
    public void init() {
        this.setDao(vendorTemplateRelRepository);
    }

    @Override
    public void deleteByVendorUuid(String vendorUuid) {
        // 1.根据vendorUuid 获取 关联表uuid集合
        List<String> uuids = vendorTemplateRelRepository.getUuidsByVendorUuid(vendorUuid);
        if (CollectionUtils.isNotEmpty(uuids)) {
            // 2.根据关联主表的uuids删除关联明细数据
            vendorTemplateRelDetailRepository.deleteByMainUuids(uuids);
            // 3.删除关联主表数据
            vendorTemplateRelRepository.deletes(uuids);
        }
    }

    @Override
    public void saveRel(VendorTemplateRelInteractivePO vendorTemplateRelInteractivePO) {
        String[] attrAttrUuids = vendorTemplateRelInteractivePO.getCheckAttrList();
        for (String attrUuid : attrAttrUuids) {
            // 1.保存关联主表
            VendorTemplateRelPO vendorTemplateRelPO = new VendorTemplateRelPO();
            vendorTemplateRelPO.setVendorUuid(vendorTemplateRelInteractivePO.getVendorUuid());
            vendorTemplateRelPO.setTemplateAttrUuid(attrUuid);
            vendorTemplateRelPO.setStatus(true);
            vendorTemplateRelRepository.create(vendorTemplateRelPO);
            // 2.保存关联明细
            List<ProductTemplateAttrValuePO> values = productTemplateAttrValueRepository.getByAttrUuid(attrUuid);
            for (ProductTemplateAttrValuePO value : values) {
                VendorTemplateRelDetailPO detailPO = new VendorTemplateRelDetailPO();
                detailPO.setRelUuid(vendorTemplateRelPO.getUuid());
                detailPO.setValueUuid(value.getUuid());
                detailPO.setStatus(true);
                detailPO.setValue(value.getValue());
                detailPO.setPosition(value.getPosition());
                vendorTemplateRelDetailRepository.create(detailPO);
            }
        }
    }

    @Override
    public List<VendorTemplateRelPO> getAllRelsByVendorUuid(String vendorUuid, boolean useStatus, boolean status) {
        // 1.根据vendorUuid 获取 关联表uuid集合
        List<String> uuids = vendorTemplateRelRepository.getUuidsByVendorUuid(vendorUuid);
        // 2.拼装对象列表
        List<VendorTemplateRelPO> list = new ArrayList<>();
        for (String uuid : uuids) {
            // 2.1 获取主表记录
            VendorTemplateRelPO vendorTemplateRelPO = vendorTemplateRelRepository.getByUuid(uuid);
            // 2.2 设置属性名称
            ProductTemplateAttrPO attrPO = productTemplateAttrRepository.getByUuid(vendorTemplateRelPO.getTemplateAttrUuid());
            vendorTemplateRelPO.setAttrName(attrPO.getName());
            vendorTemplateRelPO.setSpec(attrPO.isSpec());
            // 2.3 获取明细记录
            List<VendorTemplateRelDetailPO> details = vendorTemplateRelDetailRepository.getByMainUuid(uuid, useStatus, status);
            vendorTemplateRelPO.setDetails(details);
            list.add(vendorTemplateRelPO);
        }
        Collections.sort(list, new Comparator<VendorTemplateRelPO>() {
            @Override
            public int compare(VendorTemplateRelPO o1, VendorTemplateRelPO o2) {
                int spec1 = o1.isSpec() ? 1 : 0;
                int spec2 = o2.isSpec() ? 1 : 0;
                return spec2 - spec1;
            }
        });
        return list;
    }

    @Override
    public List<String> getUuidsByVendorUuid(String vendorUuid) {
        return vendorTemplateRelRepository.getUuidsByVendorUuid(vendorUuid);
    }
}
